#include "../include/CacheManager.h"
#include <stdlib.h>
#include <iostream>
using std::cout;
using std::endl;

//多线程状态下可能不安全,所以得搞成atexit+饿汉模式
CacheManager* CacheManager::_pInstance = CacheManager::getInstance();
CacheManager::CacheManager()
{
    _caches.resize(4);    
    init("../data/cache.txt");
}


CacheManager::~CacheManager()
{

}

CacheManager* CacheManager::getInstance()
{
        if(_pInstance == nullptr)
        {
            _pInstance = new CacheManager();
            atexit(destory);
        }
        return _pInstance;
}

void CacheManager::destory()
{
    if(_pInstance)
    {
        //析构的时候将数据一号缓存的数据写入到磁盘
        //这个文件写死了，怎么处理
        _pInstance->getCache(0).writeToFile("./cache.txt");
        delete _pInstance;
        _pInstance = nullptr;
    }
}

void CacheManager::init(const string filename)         //将持久化到磁盘的缓存数据重新加载到内存,调用LRUCache类中的方法
{
 
    _caches.clear();
    _caches[0].readFromFile(filename);
    for(int i = 1; i < CACHE_NUMBER; i++)
    {
        _caches[i].update(_caches[0]);
    }
}
LRUCache& CacheManager::getCache(int index)            //参数int:每一个线程对应一个缓存，线程去获取缓存
{
    return _caches[index]; 
}
void CacheManager::updateCache()                 //同步更新几个缓存内部的数据,每个缓存里边的热数据很有可能不一致，需要同步
{
    cout << "同步更新缓存" << endl;
    //先将数据同步到主缓存，再将主缓存得数据同步到其他缓存
    for(int idx = 1; idx < CACHE_NUMBER; idx++)
    {
        _caches[0].update(_caches[idx]);
    }
    for(int idx = 1; idx < CACHE_NUMBER; idx++)
    {
        _caches[idx].update(_caches[0]);
    }

    //测试:几个缓存得数据大致是一样的?,没有使用锁机制
    for(int idx = 0; idx < CACHE_NUMBER; idx++)
    {
        cout << "########################" << idx <<"################################" << endl;
        _caches[idx].print_cache();
        cout << "########################" << idx <<"################################" << endl;
    }
    //写入磁盘
    _caches[0].writeToFile("../data/cache.txt");
}
